package lrucache;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @ClassName LRUCache
 * @Description  LRU 缓存  ---->  最近最少使用缓存
 * @Author ZJX
 * @Date 2024/9/8 10:10
 * @Version 1.0
 */
public class LRUCache<K,V> extends LinkedHashMap<K, V>{

    private  int capacity;

    public LRUCache(int capacity) {
        // 调用 LinkedHashMap 的构造函数
        // 第三个参数 true 表示按访问顺序排序（LRU策略）
        super(capacity, 0.75f, true);
        this.capacity = capacity;
    }

    @Override
    public V get(Object key) {
        return super.get(key);
    }

    @Override
    public V put(K key, V value) {
        return super.put(key, value);
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > capacity;
    }

    public static void main(String[] args) {
        // 创建一个容量为 3 的 LRU 缓存
        LRUCache<Integer, String> cache = new LRUCache<>(3);

        // 添加一些元素
        cache.put(1, "A");
        cache.put(2, "B");
        cache.put(3, "C");

        // 输出缓存内容
        System.out.println(cache);  // {1=A, 2=B, 3=C}

        // 访问键 1，使得键 1 成为最近使用的
        cache.get(1);

        // 添加新元素 4，最老的键 2 被移除
        cache.put(4, "D");
        System.out.println(cache);  // {3=C, 1=A, 4=D}

        // 再添加一个新元素 5，键 3 被移除
        cache.put(5, "E");
        System.out.println(cache);  // {1=A, 4=D, 5=E}
    }

}
